/*
 * @Author: yao
 * @Date: 2024-11-12 09:30:55
 * @LastEditTime: 2024-11-22 17:52:34
 * @LastEditors: yao
 * @Description:
 * @FilePath: \element-plus-vite-starter-main\src\http\index.ts
 */
import { createAlova } from "alova";
import config from "@/config";
import adapterFetch from "alova/fetch";
import VueHook from "alova/vue";
import { getToken } from "@/utils/utils";
import { ElMessage } from "element-plus";
import { useAIStore } from "@/stores/modules/AI";

interface Resp {
  success: boolean;
  data: any;
  code: string;
  message: string;
  [key: string]: any;
}

export const AlovaInstance = createAlova({
  baseURL: "",
  statesHook: VueHook,
  // 请求适配器，这里我们使用fetch请求适配器
  requestAdapter: adapterFetch(),
  timeout: config.REQUEST_TIMEOUT,
  // 设置全局的请求拦截器，与axios相似
  beforeRequest(method) {
    method.config.headers["APP-ID"] = config.SYSTEM.GID;
    method.config.headers[config.TOKEN_KEY] = getToken();
    method.config.headers["Content-Type"] = "application/json;charset=utf-8";
  },
  responded: {
    // 请求成功的拦截器
    // 当使用GlobalFetch请求适配器时，第一个参数接收Response对象
    // 第二个参数为当前请求的method实例，你可以用它同步请求前后的配置信息
    onSuccess: async (response, method) => {
      if (response.status === 503 || response.status === 200) {
        const json: Resp = await response.json();
        return json;
      } else {
        useAIStore().setContent(
          `你的${response.url}接口似乎遇到点问题，你可以找下管理员或稍后再试~`,
          "error"
        );
        // ElMessage.error("系统似乎出现了一点问题，请稍后再试！");
      }
      return response;
    },

    // 请求失败的拦截器
    // 请求错误时将会进入该拦截器。
    // 第二个参数为当前请求的method实例，你可以用它同步请求前后的配置信息
    onError: (error, method) => {
      ElMessage.error(error.message || "系统似乎出现了一点问题，请稍后再试！");
    },

    // 请求完成的拦截器
    // 当你需要在请求不论是成功、失败、还是命中缓存都需要执行的逻辑时，可以在创建alova实例时指定全局的`onComplete`拦截器，例如关闭请求 loading 状态。
    // 接收当前请求的method实例
    onComplete: async (method) => {
      // 处理请求完成逻辑
    },
  },
});
